Перейти к основному содержимому

Автоматизация коммутаторов с помощью Ansible

Ansible – это инструмент автоматизации с открытым исходным кодом, универсальный и простой в использовании. Ansible широко используется для автоматизации управления сетевым оборудованием, позволяя инженерам единообразно применять конфигурации на сетевых устройствах различных вендоров. Это значительно ускоряет развертывание изменений в сети и снижает риск человеческой ошибки по сравнению с ручным управлением через CLI.

При управлении сетями Ansible автоматизирует применение конфигураций через стандартные протоколы (SSH, NETCONF, REST API) и координирует выполнение сложных многошаговых рабочих процессов. Ansible работает по принципу «управляющий — управляемые узлы». Управляющая машина подключается к целевым системам по SSH и выполняет на них нужные команды с помощью модулей. Эти модули объединяются в задачи и сценарии (playbooks), которые описывают желаемое состояние инфраструктуры. Всё управление осуществляется через простой текстовый интерфейс и конфигурационные файлы в формате YAML.

Одним из его ключевых преимуществ является использование наглядного языка разметки YAML, на котором создаются сценарии автоматизации. Эти сценарии просты в понимании и написании, что делает Ansible доступным для всех.

Ansible работает по принципу «управляющий — управляемые узлы». Управляющая машина подключается к целевым системам по SSH и выполняет на них нужные команды с помощью модулей. Эти модули объединяются в задачи и сценарии (playbooks), которые описывают желаемое состояние инфраструктуры. Всё управление осуществляется через простой текстовый интерфейс и конфигурационные файлы в формате YAML.

Синтаксис YAML

Этот playbook предназначен для автоматизации включения протокола LLDP (Link Layer Discovery Protocol) на сетевых устройствах Linki. Playbook подключается к коммутаторам (switches) через CLI и выполняет глобальную команду lldp enable, которая активирует протокол на устройстве для обнаружения соседних сетевых устройств

---
- name: LLDP enable
hosts: switches
connection: network_cli
gather_facts: no

tasks:
- name: Enable LLDP globally
ios_config:
lines:
- lldp enable

AD Hoc - быстрое управление сетью

AD Hoc – это быстрый способ выполнить команды на одном или нескольких устройствах без создания полноценного Playbook, для срочных операций, проверок и диагностики.

Проверка версии прошивки на коммутаторе с помощью AD Hoc команды

root@root:/ansible-network-demo# ansible switch1 -m ios_command -a "commands='show ver'"
10.57.57.90 | SUCCESS => {
"changed": false,
"stdout": [
"Linki.Systems Software, LK-DS-750, Version 10.3.4\nCopyright (C) Linki.Systems, https://linki.systems/. (enterprise-id 59682) All Rights Reserved.\nThe current running image is flash:/boot/linki-peaknetx-v10.3.4.bin\n\nLK-DS-750 uptime is 0 days, 1 hours, 0 minutes\nHardware Type is 48x25G-8x100G\nHardware Version is 3.3\nSDRAM size 2048M\nFlash size 8192M\nEPLD Version is 1.3\nBootRom Version is A.1.20\nSystem serial number is LKDH01242172E700006\nCurrent Web Version is 3.0.1"
],
"stdout_lines": [
[
"Linki.Systems Software, LK-DS-750, Version 10.3.4",
"Copyright (C) Linki.Systems, https://linki.systems/. (enterprise-id 59682) All Rights Reserved.",
"The current running image is flash:/boot/linki-peaknetx-v10.3.4.bin",
"",
"LK-DS-750 uptime is 0 days, 1 hours, 0 minutes",
"Hardware Type is 48x25G-8x100G",
"Hardware Version is 3.3",
"SDRAM size 2048M",
"Flash size 8192M",
"EPLD Version is 1.3",
"BootRom Version is A.1.20",
"System serial number is LKDH01242172E700006",
"Current Web Version is 3.0.1"
]
]
}

Базовая конфигурация сетевых протоколов и управление VLAN Данный плейбук автоматизирует создание и активацию оверлейной сети для VLAN на коммутаторах Linki. Он использует переменные для идентификатора VLAN, переходит в режим конфигурации базы VLAN и выполняет команды для создания указанного VLAN и включения для него оверлейной функциональности.

---
- name: Create and enable overlay for vlan
hosts: switches
gather_facts: no
vars:
vid: 20
vname: 20

tasks:
- name: create vlan
ios_config:
parents: vlan database
lines:
- "vlan {{vid}}"
- "vlan {{vid}} overlay enable"
- "exit"

Когда Ansible выполняет задачу, он подставляет значение переменной прямо в конфигурационные строки.

Например, строка vlan {{ vid }} превращается в vlan 20, а vlan {{ vid }} overlay enable — в команду включения overlay именно для этого VLAN.

Шаблоны Jinja2

Шаблоны Jinja2 — это файлы, содержащие статический текст с динамическими элементами (переменными, циклами, условиями), которые генерируются с помощью движка шаблонов Jinja2. Они широко используются в Ansible для создания конфигурационных файлов, которые адаптируются под конкретные параметры хостов (например, IP-адреса, имена интерфейсов). Такой подход позволяет разделить статическую структуру конфигурации и динамические данные, что упрощает управление настройками для множества устройств.

Шаблон конфигурации VXLAN-оверлея с удаленными VTEP

overlay
!
source {{ overlay.source_ip}}
{% for vtep in overlay.remote_vteps %}
remote-vtep {{ vtep.id }} ip-address {{ vtep.ip }} type vxlan
{% endfor %}
!
{% for vlan in overlay.vlans %}
vlan {{ vlan.id }} vni {{ vlan.vni }}
vlan {{ vlan.id }} remote-vtep {{ vlan.remote_vtep }}
{% endfor %}

Переменные хоста для конфигурации VXLAN (switch1)

/inventory/host_vars/switch1.yml

overlay:
source_ip: 1.1.1.1
remote_vteps:
- id: 1
ip: 1.1.1.2
vlans:
- id: 20
vni: 200
remote_vtep: 1

Топология сети

Рисунок 21-1: Топология сети

Рисунок 21-1: Топология сети

В данном примере используется лабораторная среда из двух коммутаторов linki — switch1 и switch2, а также управляющего узла Ansible.

Коммутаторы соединены между собой линком в подсети 10.10.10.0/24 (интерфейсы eth-0-27 и eth-0-1), и каждый из них выполняет роль VTEP в VXLAN:

  • На switch1 IP-адрес VTEP — 1.1.1.1
  • На switch2 IP-адрес VTEP — 1.1.1.2

Оба коммутатора используют VLAN 20, соответствующий VNI 200.

Для обмена маршрутной информацией между коммутаторами будет настроен OSPF (Process ID 200) через интерфейсы в сети 10.10.10.0/24.

На основе данных, хранящихся в Ansible-инвентаре и переменных (host_vars), Ansible автоматически выполнит:

  • Настройку интерфейсов и loopback'ов
  • Конфигурацию OSPF для обмена маршрутами между коммутаторами
  • Создание VXLAN overlay

Таким образом, Ansible будет централизованно управлять сетевой конфигурацией и обеспечивать согласованность настроек OSPF и VXLAN на обоих устройствах.

Создана рабочая директория проекта /ansible-network-demo/, со структурой:

ansible-network-demo/
├── ansible.cfg
├── inventory/
│ ├── host_vars/
│ │ ├── switch1.yml
│ │ └── switch2.yml
│ └── hosts.ini
├── playbooks/
│ ├── reachability_hostname.yml
├── vlan_overlay.yml
│ └── lo0_vxlan.yml
└── templates/
├── interface_template.j2
└── overlay_template.j2

В host_vars указаны индивидуальные IP-адреса интерфейсов и loopback’ов.

Ansible подключается к каждому коммутатору по SSH (network_cli) и с помощью модулей ios_config и template применяет конфигурацию OSPF и VXLAN.

Проверка доступности

(venv) root@admin:/ansible-network-demo# ansible-playbook reachablity_hostname.yml

PLAY [Configure Linki switches] ****************************************************************

TASK [ping] ************************************************************************************
ok: [switch1]
ok: [switch2]

TASK [hostname] ********************************************************************************
ok: [switch1]
ok: [switch2]

PLAY RECAP *************************************************************************************
switch1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
switch2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Создание и включение оверлей для VLAN

(venv) root@admin:/ansible-network-demo# ansible-playbook vlan_overlay.yml

PLAY [Create and enable overlay for vlan] ******************************************************

TASK [create vlan] *****************************************************************************
changed: [switch1]
changed: [switch2]

PLAY RECAP *************************************************************************************
switch1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
switch2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Конфигурация интерфейсов и протоколов

(venv) root@admin:/ansible-network-demo# ansible-playbook lo0_vxlan.yml

PLAY [Vxlan uplink and lo0 interface configuration] ********************************************

TASK [lo0 interface configuration] *************************************************************
ok: [switch1]
ok: [switch2]

TASK [Apply configuration] *********************************************************************
changed: [switch1]
changed: [switch2]

TASK [overlay attribute configuration] *********************************************************
changed: [switch1]
changed: [switch2]

TASK [Apply configuration] *********************************************************************
changed: [switch1]
changed: [switch2]

TASK [Cofigure OSPF process and network] *******************************************************
changed: [switch1]
changed: [switch2]

PLAY RECAP *************************************************************************************
switch1 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
switch2 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Проверка

switch2# show overlay
------------------------------------------------------------------------------------------------
ECMP Mode : normal
Source VTEP : 1.1.1.2

Vlan Vni Type Remoute-vtep IP-Address Src-Address Head-end-flooding Protocol
------------------------------------------------------------------------------------------------
20 200 VxLAN 1 1.1.1.1 1.1.1.2 Enable Static